// api/scene.ts
import apiClient from './index'; // 假设 apiClient 已配置好基础URL和认证

// 根据API设计文档 - "4场景管理" 部分。

/**
 * 后端返回的单个场景数据接口。
 * 参考: API设计文档.pdf - 第20页, /scenes/all 的"返回数据"部分
 */
export interface Scene {
  id: number; // 场景ID (Long) 
  name: string; // 场景名称 (String) 
  description?: string; // 场景描述 (String) 
  enabled?: boolean; // 是否启用 (Boolean) 
  priority?: number; // 场景优先级 (Integer) (示例响应中包含此字段) 
}

/**
 * 获取所有场景列表的API响应接口。
 * 参考: API设计文档.pdf - 第20页, /scenes/all 的"返回数据"部分
 */
export interface GetAllScenesResponse {
  ok: boolean; // 是否成功 (bool) 
  data: {
    scenes: Scene[]; // 场景列表 (Array) 
    total: number; // 总数量 (Integer) 
    page: number; // 当前页码 (Integer) 
    page_size: number; // 每页数量 (Integer) 
  };
}

/**
 * 创建新场景的请求数据接口。
 * 参考: API设计文档.pdf - 第21页, /scenes 的"请求参数"部分
 */
export interface CreateSceneData {
  name: string; // 场景名称 (String, 必需) 
  description?: string; // 场景描述 (String, 可选) 
  enabled?: boolean; // 是否启用 (Boolean, 可选, 默认true) 
}

/**
 * 创建场景的API响应接口。
 * 参考: API设计文档.pdf - 第22页, /scenes 的"返回数据"部分
 */
export interface CreateSceneResponse {
  ok: boolean; // 是否成功 (bool) 
  data: {
    id: number; // 场景ID (Long) 
    name: string; // 场景名称 (String) 
    description?: string; // 场景描述 (String) 
    enabled: boolean; // 是否启用 (Boolean) 
    priority: number; // 优先级 (Integer) (示例响应中包含此字段) 
  };
}

/**
 * 更新现有场景的请求数据接口。
 * 参考: API设计文档.pdf - 第24页, PATCH /scenes/{scene_id} 的"Body参数"部分
 */
export interface UpdateSceneData {
  name?: string; // 场景名称 (String, 可选) 
  description?: string; // 场景描述 (String, 可选) 
  enabled?: boolean; // 是否启用 (Boolean, 可选) 
  priority?: number; // 优先级 (Integer) (示例请求中包含此字段) 
}

/**
 * 更新场景的API响应接口。
 * 参考: API设计文档.pdf - 第24页, PATCH /scenes/{scene_id} 的"返回数据"部分
 */
export interface UpdateSceneResponse {
  ok: boolean; // 是否成功 (bool) 
  data: {
    id: number; // 场景ID (Long) 
    name: string; // 场景名称 (String) 
    enabled: boolean; // 是否启用 (Boolean) 
    priority: number; // 优先级 (Integer) (示例响应中包含此字段) 
  };
}

/**
 * 添加/更新场景设备的API响应接口。
 * 参考: API设计文档.pdf - 第26页, POST /scenes/{scene_id}/devices 的"返回数据"部分
 */
export interface AddOrUpdateSceneDeviceResponse {
  ok: boolean; // 是否成功 (bool) 
  data: {
    sceneld: number; // 场景ID (Long) 
    deviceld: number; // 设备ID (Long) 
    params: Record<string, any>; // 设备参数配置 (Object) 
    createdAt: string; // 创建时间 (String, ISO-8601) 
    updatedAt: string; // 更新时间 (String, ISO-8601) 
  }
}

/**
 * 调整场景优先级的请求数据接口。
 * 参考: API设计文档.pdf - 第28页, PUT /scenes/{scene_id}/priority 的"Body参数"部分
 */
export interface ScenePriorityData {
  action: 'move_up' | 'move_down' | 'set_priority'; // 调整动作 (String, 必需) 
  priority?: number; // 具体优先级值 (Integer, 可选, action为set_priority时必需) 
}

/**
 * 调整场景优先级的API响应接口。
 * 参考: API设计文档.pdf - 第28页, PUT /scenes/{scene_id}/priority 的"返回数据"部分
 */
export interface AdjustScenePriorityResponse {
  ok: boolean; // 是否成功 (bool) 
  data: {
    sceneld: number; // 场景ID (Long) 
    priority: number; // 当前优先级 (Integer) 
    previousPriority?: number; // 调整前优先级 (Integer) 
  }
}

/**
 * 手动激活场景的API响应接口。
 * 参考: API设计文档.pdf - 第29页, POST /scenes/{scene_id}/activate 的"返回数据"部分
 */
export interface ActivateSceneResponse {
  ok: boolean; // 是否成功 (bool) 
  data: {
    sceneld: number; // 场景ID (Long) 
    executionId: string; // 执行ID (String) 
    status: string; // 执行状态 (String) 
  };
}

/**
 * 获取当前生效场景列表中单个场景的数据接口。
 * 参考: API设计文档.pdf - 第30页, GET /scenes/active 的"返回数据"部分
 */
export interface ActiveScene {
  sceneld: number; // 场景ID (Long) 
  name: string; // 场景名称 (String) 
  description?: string; // 场景描述 (String) 
  status: 'active' | 'executing' | 'completed'; // 场景状态 (String) 
  activatedAt: string; // 激活时间 (String, ISO-8601) 
  executionId: string; // 执行ID (String) 
  priority: number; // 场景优先级 (Integer) 
}

/**
 * 获取当前生效场景列表的API响应接口。
 * 参考: API设计文档.pdf - 第30页, GET /scenes/active 的"返回数据"部分
 */
export interface GetActiveScenesResponse {
  ok: boolean; // 是否成功 (bool) 
  data: {
    activeScenes: ActiveScene[]; // 当前生效场景列表 (Array) 
    totalActive: number; // 当前生效场景总数 (Integer) 
  };
}

/**
 * 获取所有场景列表。
 * GET /scenes/all 
 * @param page 可选页码，默认1。 
 * @param page_size 可选每页数量，默认10，最大100。 
 */
export const getScenes = (page: number = 1, page_size: number = 10) => {
  return apiClient.get<GetAllScenesResponse>(`/scenes/all`, {
    params: { page, page_size },
  });
};

/**
 * 创建新场景。
 * POST /scenes 
 * @param sceneData 新场景的数据 (名称、描述、是否启用)。 
 */
export const createScene = (sceneData: CreateSceneData) => {
  return apiClient.post<CreateSceneResponse>(`/scenes`, sceneData);
};

/**
 * 获取特定场景的详细信息。
 * GET /scenes/{scene_id} 
 * @param sceneId 场景的ID。 
 */
export const getSceneDetails = (sceneId: number) => {
  // 返回类型Scene包含文档中详情接口可能返回的更多字段，例如devices和actions
  return apiClient.get<Scene>(`/scenes/${sceneId}`);
};

/**
 * 更新现有场景。
 * PATCH /scenes/{scene_id} 
 * @param sceneId 要更新的场景ID。 
 * @param sceneData 部分更新数据 (名称、描述、是否启用)。 
 */
export const updateScene = (sceneId: number, sceneData: UpdateSceneData) => {
  return apiClient.patch<UpdateSceneResponse>(`/scenes/${sceneId}`, sceneData);
};

/**
 * 删除场景。
 * DELETE /scenes/{scene_id} 
 * @param sceneId 要删除的场景ID。 
 */
export const deleteScene = (sceneId: number) => {
  console.log(`deleteScene called: ${sceneId}`);
  return apiClient.delete(`/scenes/${sceneId}`); // 返回204状态码，无内容 
};

/**
 * 在场景中添加设备
 * POST /scenes/{scene_id}/devices 
 * @param sceneId 场景的ID。 
 * @param deviceId 设备ID及其参数。 
 */
export const addSceneDevice = (sceneId: number, deviceId: number) => {
  return apiClient.post<AddOrUpdateSceneDeviceResponse>(`/scenes/${sceneId}/devices`, { device_id: deviceId });
};

/**
 * 从场景中移除设备。
 * DELETE /scenes/{scene_id}/devices/{device_id} 
 * @param sceneId 场景的ID。 
 * @param deviceId 要移除的设备ID。 
 */
export const removeSceneDevice = (sceneId: number, deviceId: number) => {
  return apiClient.delete(`/scenes/${sceneId}/devices/${deviceId}`); // 返回204状态码，无内容 
};

/**
 * 调整场景的优先级。
 * PUT /scenes/{scene_id}/priority 
 * @param sceneId 场景的ID。 
 * @param priorityData 调整优先级的动作 (move_up, move_down, set_priority) 以及可选的特定优先级值。 
 */
export const adjustScenePriority = (sceneId: number, priorityData: ScenePriorityData) => {
  return apiClient.put<AdjustScenePriorityResponse>(`/scenes/${sceneId}/move`, priorityData);
};

/**
 * 手动激活场景。
 * POST /scenes/{scene_id}/activate 
 * @param sceneId 要激活的场景ID。 
 */
export const activateScene = (sceneId: number) => {
  return apiClient.post<ActivateSceneResponse>(`/scenes/${sceneId}/activate`);
};

export const switchScene = (sceneId: number) => {
  return apiClient.post<ActivateSceneResponse>(`/scenes/${sceneId}/switch`);
};

/**
 * 获取当前正在生效或执行中的场景列表。
 * GET /scenes/active 
 */
export const getActiveScenes = () => {
  return apiClient.get<GetActiveScenesResponse>(`/scenes/active`);
};

export const adjustSceneDevice = (sceneId: number, deviceId: number, state: Record<string, any>) => {
  return apiClient.post<AddOrUpdateSceneDeviceResponse>(`/scenes/${sceneId}/devices/${deviceId}/set_state`, { state });
}

export interface TriggerMetadataItem {
  type: string; // 触发器类型，如 "time_range"、"motion"
  config_keys: string[]; // 配置字段
}

/**
 * 获取触发器元数据的API响应
 */
export interface GetTriggerMetadataResponse {
  ok: boolean;
  data: TriggerMetadataItem[];
}

/**
 * 获取触发器元数据
 * GET /triggers/metadata
 */
export const getTriggerMetadata = () => {
  return apiClient.get<GetTriggerMetadataResponse>(`/triggers/metadata`);
};

/**
 * 设置触发器的请求体
 */
export interface SetTriggerRequest {
  type: string; // 触发器类型
  config: Record<string, any>; // 触发器配置
}

/**
 * 设置触发器的API响应
 */
export interface SetTriggerResponse {
  ok: boolean;
  data: {
    id: number;
    type: string;
    config: Record<string, any>;
  };
}

/**
 * 设置场景触发器
 * POST /scenes/{scene_id}/triggers
 * @param sceneId 场景ID
 * @param trigger 触发器配置
 */
export const setSceneTriggers = (sceneId: number, trigger: SetTriggerRequest) => {
  return apiClient.post<SetTriggerResponse>(`/scenes/${sceneId}/triggers`, trigger);
};
